<?php
/*
	总控制器
	@author Paul huang
*/

class Action {
	/* 模板目录 */
	protected static $tplpath;
	
	/* Smarty实例对象 */
	protected static $smarty = null;
	
	/*
	 *	Init(初始化Smarty模板类) 单例模式初始化Smarty,设置Smarty配置
	*/
	protected function Init() {
		/* 单例模式初始化Smarty */
		if ( is_null ( self::$smarty ) ) {
			self::$smarty = new Smarty ();
			self::$tplpath = PATH_TPL;
			/* 模板目录 */
			self::$smarty->setTemplateDir ( self::$tplpath );
			/* 编译目录 */
			self::$smarty->setCompileDir ( PATH_ROOT . 'Temp/' );
			/* 配置目录 */
			self::$smarty->setConfigDir ( PATH_ROOT . 'Config/' );
			/* 缓存目录 */
			self::$smarty->setCacheDir ( PATH_ROOT . 'Cache/' );
			
			/* 是否开启调试 */
			//self::$smarty->debugging = DEBUG;
			self::$smarty->debugging = false;
			/* 缓存时间 */
			self::$smarty->setCacheLifetime ( 3600 );
			/* Smarty左边界符 */
			self::$smarty->left_delimiter = '{';
			/* Smarty右边界符 */
			self::$smarty->right_delimiter = '}';
			/* ? */
			self::Config ();
		}
	}
	
	/*
		Clear(清除缓存)
		清除所有模板编译与缓存
	*/
	protected function Clear() {
		self::Init ();
		//清除模板编译文件
		self::$smarty->clearCompiledTemplate ();
		//清除全部缓存
		self::$smarty->clearAllCache ();
	}
	
	/*
		Config(全局变量设置)
		加载自定义常量以及自定义全局变量到Smarty模板
	*/
	protected function Config(){
		self::Init ();
		/* 注入自定义常量到smarty模板 */
		self::SetDefines ();
		/* 注入自定义全局变量数组到smarty模板 */
		self::SetGlobals ();
	}
	
	/*
		TplFile(处理模板文件名) 返回相应的文件路径
		@para $TplFile [string] 方法路径名(index/index)
	*/
	protected function TplFile($TplFile) {
		/* $TplFile 为空,返回当前操作 类/方法 */
		if ($TplFile == '') {
			$TplFile .= MVC::$URL_CLASS . '/' . MVC::$URL_METHOD;
		}

		$TplFile .= TPL_EXT;
		return $TplFile;
	}
	
	/*
		Display(显示模板)
		输出处理模板后的结果(HTML)到浏览器
		@para name="$TplFile" type="string" 方法路径名(pro/test/do1)
	*/
	public function Display($TplFile = '') {
		self::Init ();
		/* 调用Smarty 模板内置display方法显示模板 */
		self::$smarty->display ( self::TplFile ( $TplFile ) );
		
		/* 调试模式下 清除所有模板编译与缓存 ,便于测试 */
		if (DEBUG) {
			self::Clear ();
		}
	}
	
	/*
		Fetch(得到处理模板后的结果(HTML))
		得到编译后的html代码
		@para name="$TplFile" type="string"方法路径名(index/index)
		@return string
	*/
	public function Fetch($TplFile = '') {
		self::Init ();
		$output = self::$smarty->Fetch ( self::TplFile ( $TplFile ) );
		if (DEBUG) {
			self::Clear (); // 除所有模板编译与缓存，调试模式下有效
		}
		return $output;
	}
	
	/*
		Assign(模板变量赋值) 传值到模板上
		@para name="$key" type="string" 模板变量名称
		@para name="$value" type="string / int / array"  变量值
	*/
	public function Assign($key, $value = null) {
		self::Init ();
		/* 调用Smarty 模板内置assign方法传值到模板 */
		self::$smarty->assign ( $key, $value );
	}

	/*
		SetGlobals(自定义全局变量加载到Smarty)
		注入自定义全局变量数组到smarty模板
	*/
	public function SetGlobals() {
		self::Init ();
		$MyGlobals = array ();
		foreach ( $GLOBALS as $k => $v ) {
			/* 过虑掉系统全局变量, PHP5.2 版本以上,过滤敏感变量 db */
			if (! in_array ( $k, array ('GLOBALS','_POST','_GET','_COOKIE','_FILES','_SERVER') )) {
				$MyGlobals [$k] = $v;
			}
		}
		self::$smarty->assign ( $MyGlobals );
	}
	
	/*
		SetDefines(注入自定义常量到smarty模板)
		注入自定义全局变量数组到smarty模板
	*/
	public function SetDefines() {
		self::Init ();
		$Start     = false;
		$MyDefines = array ();
		$DefineArr = get_defined_constants ();
		foreach ( $DefineArr as $k => $v ) {
			if ($k == 'DEBUG') {
				$Start = true;
			}
			if ($Start) {
				$MyDefines [$k] = $v;
			}
		}
		self::$smarty->assign ( $MyDefines );
	}
	
    /**
	 * jump method
	 * @param string $message => 跳转时显示的信息
	 * @param int $status => 状态 0表示错误 1表示成功
	 * @param string $jumpUrl => 要跳转的地址 默认为上一页面地址
	 * @param int $wait => 等待时间
	 */
    protected function jump($message, $status = 1, $jumpUrl, $wait = 0){
        $time = $wait*1000;
        $buffer['waitSecond'] = $time;
        $buffer['second'] = $wait;
        $buffer['jumpUrl'] = $jumpUrl;
        $buffer['message'] = $message;
        $buffer['PageTitle'] = '页面提示';

        if($status) {
            if(!$wait) {
                $buffer['waitSecond'] = 1000;// 成功操作后默认停留1秒
        		$buffer['second'] = 1;
            }
        } else {
            if(!$wait) {
                $buffer['waitSecond'] = 3000;// 成功操作后默认停留3秒
        		$buffer['second'] = 3;
            }
         }
    	 if(!$jumpUrl) {
             $buffer['jumpUrl'] = 'javascript:history.back(-1)';// 默认发生错误的话自动返回上页
         }
		 foreach($buffer as $K => $V){
			self::Assign($K, $V);
		 }
         self::Display('Public/Tips');
         exit;
    }
    
    
    /**
	 * 错误时的跳转方法
	 *
	 * @param string $message => 跳转时显示的信息
	 * @param string $jumpUrl => 要跳转的地址 默认为上一页面地址
	 * @param int $wait => 等待时间 默认为3秒
	 */
    public function Error($message, $jumpUrl = '', $wait = 3) {
        self::jump($message, 0, $jumpUrl, $wait);
    }
    
    
    /**
	 * 成功时的跳转方法
	 *
	 * @param string $message => 跳转时显示的信息
	 * @param string $jumpUrl => 要跳转的地址 默认为上一页面地址
	 * @param int $wait => 等待时间 默认为1秒
	 */
    public function Success($message, $jumpUrl = '', $wait = 1) {
        self::jump($message, 1, $jumpUrl, $wait);
    }

    /*
        ajax返回信息
    */

    protected function AjaxReturn($data,$type = 'json') {
		$type = strtoupper($type);
		switch (strtoupper($type)){
            case 'JSON' :
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                exit(json_encode($data));
            case 'XML'  :
                // 返回xml格式数据
                header('Content-Type:text/xml; charset=utf-8');
                exit(xml_encode($data));
            case 'JSONP':
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                $handler  =   isset($_GET['callback']) ? $_GET['callback'] : 'jsonpReturn';
                exit($handler.'('.json_encode($data).');');  
            
			case 'EVAL':
			default   :
                // 返回可执行的js脚本
                header('Content-Type:text/html; charset=utf-8');
                exit($data);            
        }
    }

    /*
        是否AJAX请求
    */
    protected function IsAjax() {
        if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ) {
            if('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])){
                return true;
            }
        }
        return false;
    }
	
	/*
	 *	返回当前类名
	*/
	protected function GetClassName() {
		if(MVC::$URL_CLASS) {
			return MVC::$URL_CLASS;
		}
	}
	
	/*
	 *	返回当前方法名
	*/
	protected function GetMethodName() {
		if(MVC::$URL_METHOD) {
			return MVC::$URL_METHOD;
		}
	}
}